package view;

import java.util.ArrayList;
import java.util.List;

import javax.swing.table.AbstractTableModel;

import model.Prenda;


/**
 * Esta clase representa el modelo de la tabla que se utiliza para agregar prendas a un conjunto.
 *
 */
@SuppressWarnings("serial")
public class PrendasTableModel extends AbstractTableModel  {
    
	private static final int SELECCIONADO = 0;
    private static final int CODIGO = 1;
    private static final int NOMBRE = 2;
	
    /** lista que contiene las prendas */
	private List<Prenda> prendas;
    
    final static String[] columnNames = {"Seleccionado", "Codigo", "Nombre"};
    
    boolean isEditable = true;

    public PrendasTableModel(List<Prenda> prendas) {
        this.prendas = prendas;
    }

    public String getColumnName(int col) {
        return columnNames[col];
    }

   public int getRowCount() {
        return prendas.size();
    }

    public int getColumnCount() {
        return columnNames.length;
    }

    public Object getValueAt(int row, int col) {
        Object result = null;
        Prenda prenda = prendas.get(row);
        switch (col) {
            case SELECCIONADO:
                result = prenda.isSelected();
                break;
            case CODIGO:
                result = prenda.getCodigo();
                break;
            case NOMBRE:
                result = prenda.getNombre();
                break;
        }
        return result;

    }
    
    @SuppressWarnings({ "unchecked", "rawtypes" })
	public Class getColumnClass(int c) {
    	if(c == SELECCIONADO){
    		return Boolean.class;
    	}
    	
        return String.class;
    }
    
    public void setPrendas(List<Prenda> prendas) {
		this.prendas = prendas;
		fireTableRowsInserted(prendas.size(), prendas.size());
	}
    
    public boolean isCellEditable(int row, int col) {
    	if(col == SELECCIONADO){
    		return true;
    	}
        return false;
    }
    
    public void setEditable(boolean isEditable){
        this.isEditable = isEditable;
    }

    public void setValueAt(Object value, int row, int col) {
        Prenda prenda = prendas.get(row);

        switch (col) {
	        case SELECCIONADO:
	        	Boolean selected = (Boolean)value;
	            prenda.setSelected(selected);
	            break;
        }
    }
    
    public List<Prenda> getPrendasSeleccionadas() {
    	List<Prenda> seleccionados = new ArrayList<Prenda>();
    	for(Prenda prenda: prendas) {
    		if(prenda.isSelected()){
    			seleccionados.add(prenda);
    		}
    	}
    	return seleccionados;
    }

	public void setPrendasConjunto(List<Prenda> prendasConjunto) {
		for (Prenda prenda : prendas) {
			for(Prenda prendaConjunto: prendasConjunto) {
				if(prenda.hasCodigo(prendaConjunto.getCodigo())) {
					prenda.setSelected(true);
					prenda.setCantidad(prendaConjunto.getCantidad());
				}
			}
		}
		
		fireTableRowsInserted(prendas.size(), prendas.size());
	}
}
